/*
 * IO 
 */

#ifndef GKT_IO_DEBOUNCE_H
#define GKT_IO_DEBOUNCE_H

#include "gkt_types.h"

#ifdef __cplusplus
extern "C" {
#endif

enum {
	GKT_IO_DEBOUNCE_FAIL = 0,
	GKT_IO_DEBOUNCE_OK,
	GKT_IO_DEBOUNCE_MAX
};

typedef int (*gkt_io_debounce_detect_fn)(void);
typedef void (*gkt_io_debounce_complete_fn)(int result, int detect_state);

typedef struct _gkt_io_debounce_attr {
	gkt_io_debounce_detect_fn	detect_fn;
	gkt_io_debounce_complete_fn	complete_fn;
} gkt_io_debounce_attr_s;

#ifdef GKT_CONFIG_IO_DEBOUNCE_TABLE

#define GKT_IO_DEBOUNCE_ENABLE	1

#ifdef GKT_IO_DEBOUNCE_ITEM
#undef GKT_IO_DEBOUNCE_ITEM
#endif
#define GKT_IO_DEBOUNCE_ITEM(name)	\
	GKT_IO_DEBOUNCE_ID_##name
enum {
	GKT_CONFIG_IO_DEBOUNCE_TABLE,
	GKT_IO_DEBOUNCE_ID_MAX
};

#define GKT_IO_DEBOUNCE_ID(name)	\
	GKT_IO_DEBOUNCE_ID_##name

#else
#define GKT_IO_DEBOUNCE_ENABLE	0
#define GKT_IO_DEBOUNCE_ID(name)	0
#endif

#define GKT_IO_DEBOUNCE_DURATION_MAX	(~0)

int gkt_io_debounce_config(uint32_t id, 
			gkt_io_debounce_attr_s *attr);
int gkt_io_debounce_start(uint32_t id, 
			int detect_state, uint32_t duration_ms);
int gkt_io_debounce_init(void);

#ifdef __cplusplus
}
#endif

#endif	/* GKT_IO_DEBOUNCE_H */

